home *** CD-ROM | disk | FTP | other *** search
- package com.ibm.xml.internal;
-
- import com.ibm.xml.framework.ContentModel;
- import com.ibm.xml.framework.ContentSpecNode;
- import com.ibm.xml.framework.ElementDeclPool;
- import com.ibm.xml.framework.InsertableElementsInfo;
- import com.ibm.xml.framework.StringPool;
- import com.ibm.xml.framework.XMLErrorHandler;
-
- class DFAContentModel implements ContentModel {
- private static final String fEpsilonString = "<<CMNODE_EPSILON>>";
- private static final String fEOCString = "<<CMNODE_EOC>>";
- private static final boolean DEBUG_VALIDATE_CONTENT = false;
- private ElementDeclPool fDeclPool;
- private int fElementIndex;
- private int[] fElemMap;
- private int fElemMapSize;
- private int fEOCIndex;
- private int fEOCPos;
- private int fEpsilonIndex;
- private XMLErrorHandler fErrHandler;
- private boolean[] fFinalStateFlags;
- private CMStateSet[] fFollowList;
- private CMNode fHeadNode;
- private int fLeafCount;
- private CMLeaf[] fLeafList;
- private ContentSpecNode fSpecNode;
- private StringPool fStringPool;
- private int[][] fTransTable;
- private int fTransTableSize;
- private boolean fEmptyContentIsValid = false;
-
- public DFAContentModel(int var1, StringPool var2, ElementDeclPool var3) throws CMException {
- this.fElementIndex = var1;
- this.fDeclPool = var3;
- this.fStringPool = var2;
- this.fEpsilonIndex = this.fStringPool.addSymbol("<<CMNODE_EPSILON>>");
- this.fEOCIndex = this.fStringPool.addSymbol("<<CMNODE_EOC>>");
- this.fSpecNode = new ContentSpecNode();
- this.fDeclPool.getContentSpecNode(this.fDeclPool.getContentSpec(this.fElementIndex), this.fSpecNode);
- this.buildDFA();
- }
-
- public int validateContent(int var1, int[] var2) throws CMException {
- if (var1 == 0) {
- return this.fEmptyContentIsValid ? -1 : 0;
- } else {
- int var3 = 0;
-
- for(int var4 = 0; var4 < var1; ++var4) {
- int var5 = var2[var4];
-
- int var6;
- for(var6 = 0; var6 < this.fElemMapSize && this.fElemMap[var6] != var5; ++var6) {
- }
-
- if (var6 == this.fElemMapSize) {
- return var4;
- }
-
- var3 = this.fTransTable[var3][var6];
- if (var3 == -1) {
- return var4;
- }
- }
-
- if (!this.fFinalStateFlags[var3]) {
- return var1;
- } else {
- return -1;
- }
- }
- }
-
- public int whatCanGoHere(boolean var1, InsertableElementsInfo var2) throws CMException {
- int var3 = 0;
-
- for(int var4 = 0; var4 < var2.insertAt; ++var4) {
- int var5 = var2.curChildren[var4];
-
- int var6;
- for(var6 = 0; var6 < this.fElemMapSize && this.fElemMap[var6] != var5; ++var6) {
- }
-
- if (var6 == this.fElemMapSize) {
- return var4;
- }
-
- var3 = this.fTransTable[var3][var6];
- if (var3 == -1) {
- return var4;
- }
- }
-
- int var8 = var3;
- var2.canHoldPCData = false;
- var2.isValidEOC = this.fFinalStateFlags[var3];
- var2.resultsCount = this.fElemMapSize;
- if (var2.results == null || var2.results.length < var2.resultsCount) {
- var2.results = new boolean[var2.resultsCount];
- }
-
- if (var2.possibleChildren == null || var2.possibleChildren.length < var2.resultsCount) {
- var2.possibleChildren = new int[var2.resultsCount];
- }
-
- for(int var9 = 0; var9 < this.fElemMapSize; ++var9) {
- var2.possibleChildren[var9] = this.fElemMap[var9];
- var2.results[var9] = this.fTransTable[var8][var9] != -1;
- }
-
- if (var1) {
- for(int var7 = 0; var7 < var2.resultsCount; ++var7) {
- if (var2.results[var7]) {
- var2.curChildren[var2.insertAt] = var2.possibleChildren[var7];
- if (this.validateContent(var2.childCount, var2.curChildren) != -1) {
- var2.results[var7] = false;
- }
- }
- }
- }
-
- return -1;
- }
-
- private void buildDFA() throws CMException {
- ContentSpecNode var1 = new ContentSpecNode();
- CMLeaf var2 = new CMLeaf(0, this.fEOCIndex);
- this.fHeadNode = new CMBinOp(5, this.buildSyntaxTree(this.fDeclPool.getContentSpec(this.fElementIndex), var1), var2);
- this.fEOCPos = this.fLeafCount;
- var2.setPosition(this.fLeafCount++);
- this.fLeafList = new CMLeaf[this.fLeafCount];
- this.postTreeBuildInit(this.fHeadNode, 0);
- this.fFollowList = new CMStateSet[this.fLeafCount];
-
- for(int var3 = 0; var3 < this.fLeafCount; ++var3) {
- this.fFollowList[var3] = new CMStateSet(this.fLeafCount);
- }
-
- this.calcFollowList(this.fHeadNode);
- this.fElemMap = new int[this.fLeafCount];
- this.fElemMapSize = 0;
-
- for(int var4 = 0; var4 < this.fLeafCount; ++var4) {
- int var5 = this.fLeafList[var4].getElemIndex();
-
- int var6;
- for(var6 = 0; var6 < this.fElemMapSize && this.fElemMap[var6] != var5; ++var6) {
- }
-
- if (var6 == this.fElemMapSize) {
- this.fElemMap[this.fElemMapSize++] = var5;
- }
- }
-
- int var20 = this.fLeafCount * 4;
- CMStateSet[] var21 = new CMStateSet[var20];
- this.fFinalStateFlags = new boolean[var20];
- this.fTransTable = new int[var20][];
- CMStateSet var7 = this.fHeadNode.firstPos();
- int var8 = 0;
- int var9 = 0;
- this.fTransTable[var9] = this.makeDefStateList();
- var21[var9] = var7;
- ++var9;
-
- while(var8 < var9) {
- var7 = var21[var8];
- int[] var10 = this.fTransTable[var8];
- this.fFinalStateFlags[var8] = var7.getBit(this.fEOCPos);
- ++var8;
- CMStateSet var11 = null;
-
- for(int var12 = 0; var12 < this.fElemMapSize; ++var12) {
- if (var11 == null) {
- var11 = new CMStateSet(this.fLeafCount);
- } else {
- var11.zeroBits();
- }
-
- for(int var13 = 0; var13 < this.fLeafCount; ++var13) {
- if (var7.getBit(var13) && this.fLeafList[var13].getElemIndex() == this.fElemMap[var12]) {
- var11.union(this.fFollowList[var13]);
- }
- }
-
- if (!var11.isEmpty()) {
- int var14;
- for(var14 = 0; var14 < var9 && !var21[var14].isSameSet(var11); ++var14) {
- }
-
- if (var14 == var9) {
- var21[var9] = var11;
- this.fTransTable[var9] = this.makeDefStateList();
- ++var9;
- var11 = null;
- }
-
- var10[var12] = var14;
- if (var9 == var20) {
- int var15 = (int)((double)var20 * (double)1.5F);
- CMStateSet[] var16 = new CMStateSet[var15];
- boolean[] var17 = new boolean[var15];
- int[][] var18 = new int[var15][];
-
- for(int var19 = 0; var19 < var20; ++var19) {
- var16[var19] = var21[var19];
- var17[var19] = this.fFinalStateFlags[var19];
- var18[var19] = this.fTransTable[var19];
- }
-
- var20 = var15;
- var21 = var16;
- this.fFinalStateFlags = var17;
- this.fTransTable = var18;
- }
- }
- }
- }
-
- this.fEmptyContentIsValid = ((CMBinOp)this.fHeadNode).getLeft().isNullable();
- this.fHeadNode = null;
- this.fLeafList = null;
- this.fFollowList = null;
- }
-
- private final CMNode buildSyntaxTree(int var1, ContentSpecNode var2) throws CMException {
- Object var3 = null;
- this.fDeclPool.getContentSpecNode(var1, var2);
- if (var2.type == 0) {
- var3 = new CMLeaf(var2.type, var2.value, this.fLeafCount++);
- } else {
- int var4 = var2.value;
- int var5 = var2.otherValue;
- if (var2.type != 4 && var2.type != 5) {
- if (var2.type == 2) {
- var3 = new CMUniOp(var2.type, this.buildSyntaxTree(var4, var2));
- } else if (var2.type == 1) {
- var3 = new CMBinOp(4, this.buildSyntaxTree(var4, var2), new CMLeaf(0, this.fEpsilonIndex));
- } else {
- if (var2.type != 3) {
- throw new CMException(152);
- }
-
- var3 = new CMBinOp(5, this.buildSyntaxTree(var4, var2), new CMUniOp(2, this.buildSyntaxTree(var4, var2)));
- }
- } else {
- var3 = new CMBinOp(var2.type, this.buildSyntaxTree(var4, var2), this.buildSyntaxTree(var5, var2));
- }
- }
-
- return (CMNode)var3;
- }
-
- private void calcFollowList(CMNode var1) throws CMException {
- if (var1.type() == 4) {
- this.calcFollowList(((CMBinOp)var1).getLeft());
- this.calcFollowList(((CMBinOp)var1).getRight());
- } else if (var1.type() == 5) {
- this.calcFollowList(((CMBinOp)var1).getLeft());
- this.calcFollowList(((CMBinOp)var1).getRight());
- CMStateSet var5 = ((CMBinOp)var1).getLeft().lastPos();
- CMStateSet var6 = ((CMBinOp)var1).getRight().firstPos();
-
- for(int var7 = 0; var7 < this.fLeafCount; ++var7) {
- if (var5.getBit(var7)) {
- this.fFollowList[var7].union(var6);
- }
- }
-
- } else if (var1.type() == 2) {
- this.calcFollowList(((CMUniOp)var1).getChild());
- CMStateSet var2 = var1.firstPos();
- CMStateSet var3 = var1.lastPos();
-
- for(int var4 = 0; var4 < this.fLeafCount; ++var4) {
- if (var3.getBit(var4)) {
- this.fFollowList[var4].union(var2);
- }
- }
-
- } else if (var1.type() == 3 || var1.type() == 1) {
- throw new CMException(157);
- }
- }
-
- private void dumpTree(CMNode var1, int var2) throws CMException {
- for(int var3 = 0; var3 < var2; ++var3) {
- System.out.print(" ");
- }
-
- int var4 = var1.type();
- if (var4 != 4 && var4 != 5) {
- if (var1.type() == 2) {
- System.out.print("Rep Node ");
- if (var1.isNullable()) {
- System.out.print("Nullable ");
- }
-
- System.out.print("firstPos=");
- System.out.print(var1.firstPos().toString());
- System.out.print(" lastPos=");
- System.out.println(var1.lastPos().toString());
- this.dumpTree(((CMUniOp)var1).getChild(), var2 + 1);
- } else if (var1.type() == 0) {
- System.out.print("Leaf: (pos=" + ((CMLeaf)var1).getPosition() + "), " + this.fStringPool.toString(((CMLeaf)var1).getElemIndex()) + "(elemIndex=" + ((CMLeaf)var1).getElemIndex() + ") ");
- if (var1.isNullable()) {
- System.out.print(" Nullable ");
- }
-
- System.out.print("firstPos=");
- System.out.print(var1.firstPos().toString());
- System.out.print(" lastPos=");
- System.out.println(var1.lastPos().toString());
- } else {
- throw new CMException(157);
- }
- } else {
- if (var4 == 4) {
- System.out.print("Choice Node ");
- } else {
- System.out.print("Seq Node ");
- }
-
- if (var1.isNullable()) {
- System.out.print("Nullable ");
- }
-
- System.out.print("firstPos=");
- System.out.print(var1.firstPos().toString());
- System.out.print(" lastPos=");
- System.out.println(var1.lastPos().toString());
- this.dumpTree(((CMBinOp)var1).getLeft(), var2 + 1);
- this.dumpTree(((CMBinOp)var1).getRight(), var2 + 1);
- }
- }
-
- private int[] makeDefStateList() {
- int[] var1 = new int[this.fElemMapSize];
-
- for(int var2 = 0; var2 < this.fElemMapSize; ++var2) {
- var1[var2] = -1;
- }
-
- return var1;
- }
-
- private int postTreeBuildInit(CMNode var1, int var2) throws CMException {
- var1.setMaxStates(this.fLeafCount);
- if (var1.type() != 4 && var1.type() != 5) {
- if (var1.type() == 2) {
- var2 = this.postTreeBuildInit(((CMUniOp)var1).getChild(), var2);
- } else {
- if (var1.type() != 0) {
- throw new CMException(157);
- }
-
- if (((CMLeaf)var1).getElemIndex() != this.fEpsilonIndex) {
- this.fLeafList[var2++] = (CMLeaf)var1;
- }
- }
- } else {
- var2 = this.postTreeBuildInit(((CMBinOp)var1).getLeft(), var2);
- var2 = this.postTreeBuildInit(((CMBinOp)var1).getRight(), var2);
- }
-
- return var2;
- }
-
- static {
- "<<CMNODE_EPSILON>>".intern();
- "<<CMNODE_EOC>>".intern();
- }
- }
-